home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1998 April: Mac OS SDK / Dev.CD Apr 98 SDK1.toast / Development Kits (Disc 1) / QuickDraw 3D / Windows files / Q3WinSDK.exe / QD3DSDK / Samples / Win32Sample / Do_PixmapDrawContext.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-10-31  |  3.8 KB  |  110 lines

  1. // PixmapDrawContext - this module creates the Pixmap draw context
  2. // in this version is it creates an offscreen pixmap draw context with a Win32 GDI dib section attached
  3.  
  4. #include "Box3DSupport.h"
  5.  
  6.  
  7.  
  8. //----------------------------------------------------------------------------------
  9.  
  10. TQ3DrawContextObject NewPixmapDrawContext( DocumentPtr theDocument, TQ3PixelType pixelFormat )
  11. {
  12.     TQ3DrawContextData            myDrawContextData;
  13.     TQ3PixmapDrawContextData    myPixmapDrawContextData;
  14.     TQ3DrawContextObject        myDrawContext ;
  15.     TQ3Pixmap                    aPixmap;
  16.      BITMAPINFO                    *bitmapInfo;
  17.     HDC                            hdc;
  18.     size_t                        bmiSize = sizeof (BITMAPINFOHEADER) + (3 * sizeof (DWORD));
  19.  
  20.     bitmapInfo = malloc (bmiSize);
  21.     if (NULL == bitmapInfo)
  22.         return NULL;
  23.  
  24.         //    fill in draw context data.
  25.     myDrawContextData.clearImageMethod = kQ3ClearMethodWithColor;
  26.         //    Set the background color.
  27.     myDrawContextData.clearImageColor.a = 1.0F;
  28.     myDrawContextData.clearImageColor.r = (float)theDocument->clearColorR/(float)255;
  29.     myDrawContextData.clearImageColor.g = (float)theDocument->clearColorG/(float)255;
  30.     myDrawContextData.clearImageColor.b = (float)theDocument->clearColorB/(float)255;
  31.  
  32.     myDrawContextData.paneState = kQ3False;
  33.     myDrawContextData.maskState = kQ3False;
  34.     myDrawContextData.doubleBufferState = kQ3False;
  35.  
  36.         // set up device independent bitmap
  37.     hdc = GetDC(theDocument->fWindow);
  38.     theDocument->fMemoryDC = CreateCompatibleDC(hdc);
  39.  
  40.     bitmapInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);    
  41.     bitmapInfo->bmiHeader.biWidth = theDocument->fWidth;    
  42.     bitmapInfo->bmiHeader.biHeight = -(LONG)theDocument->fHeight;     // negative means top to bottom
  43.     bitmapInfo->bmiHeader.biPlanes = 1;
  44.     aPixmap.pixelType = pixelFormat;
  45.     switch ( pixelFormat )
  46.     {
  47.     case kQ3PixelTypeRGB32:
  48.     case kQ3PixelTypeARGB32:
  49.         bitmapInfo->bmiHeader.biBitCount = 32;
  50.         bitmapInfo->bmiHeader.biCompression = BI_RGB;    
  51.         aPixmap.pixelSize = 32;
  52.         break;
  53.     default:
  54.     case kQ3PixelTypeRGB16:
  55.     case kQ3PixelTypeARGB16:
  56.         bitmapInfo->bmiHeader.biBitCount = 16;
  57.         bitmapInfo->bmiHeader.biCompression = BI_RGB;    
  58.         aPixmap.pixelSize = 16;
  59.         break;
  60.     case kQ3PixelTypeRGB16_565:
  61.         {
  62.             /* create masks for 565 format 16-bit DIB */
  63.             DWORD *maskTable = (DWORD *) &(bitmapInfo->bmiColors[0]);
  64.             bitmapInfo->bmiHeader.biBitCount = 16;
  65.             bitmapInfo->bmiHeader.biCompression    = BI_BITFIELDS;    
  66.             *maskTable++ = 0xF800;    /* red */
  67.             *maskTable++ = 0x07E0;    /* green */
  68.             *maskTable = 0x001F;    /* blue */
  69.             aPixmap.pixelSize = 16;
  70.         }
  71.         break;
  72.     case kQ3PixelTypeRGB24:
  73.         bitmapInfo->bmiHeader.biBitCount = 24;
  74.         bitmapInfo->bmiHeader.biCompression = BI_RGB;    
  75.         aPixmap.pixelSize = 24;
  76.         break;
  77.     }
  78.         
  79.     /* init other BITMAPINFOHEADER fields */
  80.     bitmapInfo->bmiHeader.biSizeImage        = 0;    
  81.     bitmapInfo->bmiHeader.biXPelsPerMeter    = 0;    
  82.     bitmapInfo->bmiHeader.biYPelsPerMeter    = 0;    
  83.     bitmapInfo->bmiHeader.biClrUsed            = 0;    
  84.     bitmapInfo->bmiHeader.biClrImportant    = 0;    
  85.  
  86.     theDocument->fBitmap = CreateDIBSection(hdc, bitmapInfo, DIB_RGB_COLORS,    
  87.                                             &theDocument->fBitStorage, NULL, 0);    
  88.     SelectObject(theDocument->fMemoryDC, theDocument->fBitmap);
  89.  
  90.     /* init other QD3D pixmap fields */
  91.     aPixmap.width = theDocument->fWidth;
  92.     aPixmap.height = theDocument->fHeight;
  93.     aPixmap.image = theDocument->fBitStorage;
  94.     aPixmap.bitOrder = kQ3EndianLittle;   
  95.     aPixmap.byteOrder = kQ3EndianLittle;   
  96.     aPixmap.rowBytes = (aPixmap.width * (aPixmap.pixelSize/8));
  97.     aPixmap.rowBytes = (aPixmap.rowBytes + 3) & ~3L;  /* make it long aligned */
  98.  
  99.     /* set up the pixmapDrawContext */
  100.     myPixmapDrawContextData.pixmap = aPixmap;
  101.     myPixmapDrawContextData.drawContextData = myDrawContextData;
  102.  
  103.     /*    Create draw context and return it, if it's nil the caller must handle */
  104.     myDrawContext = Q3PixmapDrawContext_New(&myPixmapDrawContextData) ;
  105.     
  106.     free( bitmapInfo );
  107.     return myDrawContext ;
  108. }
  109.  
  110.